iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0
Mobile Development

就是從無到有寫app系列 第 22

第22天~JSON / GSON

  • 分享至 

  • xImage
  •  

JSON / GSON

JSON是一種格式=物件型態用文字表示出來像用=檔案很小
Map{key{Value}}


資料分三種:

  1. 結構化就是資料庫tsql-先規劃欄位type-放入值
  2. 半結構化-有值-分類整理 :xml檔<><> +json key:value
  3. 無結構化-檔案/圖片

JSON是半結構化

政府開放資料: https://data.gov.tw/
點到交通-有看到JSON資料類型
https://ithelp.ithome.com.tw/upload/images/20220204/20119035CYqsxDYAzE.png

點JSON下載下來點開看-

https://ithelp.ithome.com.tw/upload/images/20220204/20119035ucrT1i7qUQ.png

https://ithelp.ithome.com.tw/upload/images/20220204/20119035bwqJp9ST6j.png
JSON檔案很小可以一直塞

https://ithelp.ithome.com.tw/upload/images/20220204/201190351WA6JSyzvi.png

https://ithelp.ithome.com.tw/upload/images/20220204/20119035ayzbpOzKne.png


JSON解析器
https://jsoneditoronline.org/#left=local.dowolo&right=local.gogavu

https://ithelp.ithome.com.tw/upload/images/20220204/20119035daswWm2sb0.png

把剛剛下載的資料全部貼入

https://ithelp.ithome.com.tw/upload/images/20220204/20119035t51OxOPeLc.png


開新檔案:

https://ithelp.ithome.com.tw/upload/images/20220204/20119035mcdhP0rPdX.png

布置xml檔

https://ithelp.ithome.com.tw/upload/images/20220204/20119035ztrrlSqG2i.png


https://ithelp.ithome.com.tw/upload/images/20220204/201190356z0SHJxnDq.png

也是要綁 onclick

https://ithelp.ithome.com.tw/upload/images/20220204/20119035maZL2XfkcK.png

產生方法:

https://ithelp.ithome.com.tw/upload/images/20220204/20119035qbr3y57Mc6.png


自己產生JSON檔

把原來的Android換成Project
https://ithelp.ithome.com.tw/upload/images/20220204/20119035OTvUUdBGZE.png

換成Project

https://ithelp.ithome.com.tw/upload/images/20220204/20119035HYYjfYzBYf.png

長這樣
https://ithelp.ithome.com.tw/upload/images/20220204/20119035E3lMMSGh0U.png

展開

https://ithelp.ithome.com.tw/upload/images/20220204/20119035dbdcgHehNw.png

main-->new-->Directory
https://ithelp.ithome.com.tw/upload/images/20220204/20119035qXzSsWX3X7.png

Directory的名稱-assets 一定要有S不可以亂打

https://ithelp.ithome.com.tw/upload/images/20220204/20119035GxIFDj8GuC.png

assets 檔案

https://ithelp.ithome.com.tw/upload/images/20220204/20119035pNy6pKte5r.png

assets 檔案--再新增File

https://ithelp.ithome.com.tw/upload/images/20220204/20119035G2XtQeYP7v.png

命名檔案不要中文-要加上副檔名.json

https://ithelp.ithome.com.tw/upload/images/20220204/20119035DcoqGqA7nK.png

按enter

https://ithelp.ithome.com.tw/upload/images/20220204/20119035jysIIu9yX8.png


開始~
https://ithelp.ithome.com.tw/upload/images/20220204/20119035sSE1c5lDgP.png

開始打入key和value

https://ithelp.ithome.com.tw/upload/images/20220204/20119035r3V02UusdH.png

{
  "no": 1,
  "friends": []
}

加入物件 最後一個沒有,

https://ithelp.ithome.com.tw/upload/images/20220204/20119035OIub9yyyc9.png


那3個放在{}陣列裡面的屬性要一樣

KEY不能改: VALUE值可以改

https://ithelp.ithome.com.tw/upload/images/20220204/201190357zMVqgYhMW.png

{
  "no": 1,
  "friends": [
    {"name": "AAAA","phone": "1234567890"},
    {"name": "SONIA","phone": "0987654321"},
    {"name": "ANNY","phone": "13572468"}
  ]
}

回到java檔-宣告變數

https://ithelp.ithome.com.tw/upload/images/20220204/20119035f9WlaIY8pg.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

    //宣告變數

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onclick(View view) {
    }
}

初始化-

https://ithelp.ithome.com.tw/upload/images/20220204/20119035NfgSCXIE3z.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

    //宣告變數

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
    }
}

在onclick先產生空的暫時的容器+不同來源的取得方式

https://ithelp.ithome.com.tw/upload/images/20220204/20119035XhpasRl9xf.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

    //宣告變數

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
        //暫存資料區

        StringBuilder sb = new StringBuilder();
        String all="";

        //Assets資源管理器
        AssetManager manager = context.getAssets();

    }
}

如果要複製貼上
package com.huang.myjson;這句不能貼

//讀取JSON檔:byte-->char-->String-->一行一行讀取

https://ithelp.ithome.com.tw/upload/images/20220204/20119035aLKMFt0Zsn.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    //宣告變數

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
        //暫存資料區
        StringBuilder sb = new StringBuilder();
        String all="";
        //Assets資源管理器
        AssetManager manager = context.getAssets();

        //讀取JSON檔:byte-->char-->String-->一行一行讀取

        BufferedReader br = new BufferedReader(new InputStreamReader(manager.open("myjson.json")));

    }
}

open要拋例外 反紅才會消失

https://ithelp.ithome.com.tw/upload/images/20220204/201190356Jg2enc67N.png

目前長這樣.順序不可反
https://ithelp.ithome.com.tw/upload/images/20220204/201190354WUdg6rRUl.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    //宣告變數

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
        //暫存資料區
        StringBuilder sb = new StringBuilder();
        String all="";
        //Assets資源管理器
        AssetManager manager = context.getAssets();

        //讀取JSON檔:byte-->char-->String-->一行一行讀取

        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(manager.open("myjson.json")));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

https://ithelp.ithome.com.tw/upload/images/20220204/20119035QfPiZb95Wf.png


JSONObject obj;做初始化動作+
https://ithelp.ithome.com.tw/upload/images/20220204/20119035qzt6uGdvBn.png

轉成字串 JSONObject會反紅是因為要拋例外
https://ithelp.ithome.com.tw/upload/images/20220204/201190353L53pdzZEl.png

長這樣

https://ithelp.ithome.com.tw/upload/images/20220204/20119035anS5MDuqgJ.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    //宣告變數

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
        //暫存資料區
        StringBuilder sb = new StringBuilder();
        String all="";
        //Assets資源管理器
        AssetManager manager = context.getAssets();
        try {
            //讀取JSON檔:byte-->char-->String-->一行一行讀取
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(manager.open("myjson.json")));
            //逐行讀取並放到StringBuilder中
            String line;
            while ((line=br.readLine())!=null){
                sb.append(line);
            }

            //將字串轉成"JSON物件"
            JSONObject allObj = new JSONObject(sb.toString());

        } catch (IOException | JSONException e) {
            e.printStackTrace();
        }
    }
}

https://ithelp.ithome.com.tw/upload/images/20220204/20119035qqSu2OSqRN.png


https://ithelp.ithome.com.tw/upload/images/20220204/20119035SbZZZReyLa.png

 JSONObject allObj = new JSONObject(sb.toString());

把準字串轉
obj = new JSONObject(sb.toString());


再加入Toast這個又要用手機才可以看到結果

https://ithelp.ithome.com.tw/upload/images/20220204/20119035gX2Q811CUA.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    //宣告變數

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
        //暫存資料區
        StringBuilder sb = new StringBuilder();
        String all="";
        //Assets資源管理器
        AssetManager manager = context.getAssets();
        try {
            //讀取JSON檔:byte-->char-->String-->一行一行讀取
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(manager.open("myjson.json")));
            //逐行讀取並放到StringBuilder中
            String line;
            while ((line=br.readLine())!=null){
                sb.append(line);
            }

            //將字串轉成"JSON物件"
           obj = new JSONObject(sb.toString());

            //指定要取出的陣列
            JSONArray objArray = obj.getJSONArray("friends");

            //讀取裡面的東西.把3個name都收起來
            for(int i=0;i< objArray.length();i++){
                JSONObject o=objArray.getJSONObject(i);
                String name = o.getString("name");
                all +=name+"";
            }
            //用文字欄位顯示結果 Toast.makeText(context,all,Toast.LENGTH_SHORT).show();
            show.setText(all);

        } catch (IOException | JSONException e) {
            e.printStackTrace();
            Toast.makeText(context,"FAIL",Toast.LENGTH_SHORT).show();
        }
    }
}

抓到3個名字
https://ithelp.ithome.com.tw/upload/images/20220204/20119035F7kXC0hVgu.png

https://ithelp.ithome.com.tw/upload/images/20220204/20119035atAOdrQjgT.png

https://ithelp.ithome.com.tw/upload/images/20220204/20119035lczdfbjXke.png



下周要面試考mysql+C#我應該要來準備的.........最後錄取了~只是我不會去

其實非本科面試機會並不會很少~人人有機會

所以這篇還是先純文字~真拍謝:
/images/emoticon/emoticon06.gif

Andriod環境安裝好了之後的步驟:

  1. xml檔裡面排一些元件:像是按鈕等等
  2. Palette元件庫-按放大鏡搜尋
  3. xml檔裡面排一些元件:像是按鈕等等->Common是我們的結構樹:是一層一層關係
  4. Attributes要有東西要點到元件
  5. xml檔裡面排一些元件id=變數/沒有寫就是只能看不能被操作/首字要英文
  6. layout=元件在版面上要多高多寬
  7. 0dp的0是彈性/跟著父容器彈性縮放/dp要留著
  8. Constraint=跟誰綁定做移動/有條件
  9. 按X是不綁定=會去依靠有綁定的地方(橫的跟直的至少要綁定一個地方)
  10. 4邊都是0=自動偵測=就是至中
  11. Common Attributs要顯示甚麼字-點large字變大
  12. All Attributs 舊版改字+顏色在下面

因為又開始愛睏了~
希望...可以讓我繼續有鐵人發文的機會~拜託拜託


上一篇
第21天~OKHttp
下一篇
第23天~又是JSON+ListView
系列文
就是從無到有寫app31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言